package main

import (
	"communication-system/common/messages"
	"communication-system/common/utils"
	"communication-system/server/processer"
	"fmt"
	"io"
	"net"
)

//Server服务器的控制器,用来分发主程序的逻辑请求
//编写一个ServerProcessMes的函数，根据客户端发送的消息种类不同，以此来决定调用哪个函数继续下一步

type Proccrontol struct {
	Conn net.Conn
}

//该函数会根据客户端传来的消息体Type进行判断下一步执行的操作
func (proccrontol *Proccrontol) ServerProcessMes(mes *messages.Message) (err error) {
	switch mes.Type {
	case messages.LoginMessType:
		//处理登录的业务逻辑
		userprocess := &processer.UserProcess{
			Conn: proccrontol.Conn,
		}
		err = userprocess.ServerProcessLogin(mes)
		if err != nil {
			return
		}
	case messages.RegisterMessType:

		//处理注册的业务逻辑
		fmt.Println("处理注册的业务逻辑....")
		userprocess := &processer.UserProcess{
			Conn: proccrontol.Conn,
		}
		err = userprocess.ServerProcessRegister(mes)
		if err != nil {
			return
		}
	case messages.SmsMesType:

		//创建一个smsprocess实例处理群发消息
		var smsprocess =&processer.SmsProcess{}
		smsprocess.SendGroupMes(mes)
	default:
		fmt.Println("要处理的消息类型不存在,无法处理")
		return
	}

	return
}

//处理服务端与客户端的交互
func (proccrontol *Proccrontol) process2() (err error) {
	defer proccrontol.Conn.Close()
	fmt.Println("接收到客户端的请求数据")
	for {

		//Readpkg()读取客户端发来的消息,得到的mes是一个经过反序列化的结构体
		transfer := &utils.TransFer{

			Conn: proccrontol.Conn,
		}
		mes, err := transfer.Readpkg()
		if err == io.EOF {
			fmt.Println("客户端退出连接,我也退出连接....")
			return err
		}
		fmt.Println("mes...:", mes)
		//将接收到的数据传给ServerProcessMes去处理，为了解耦

		err = proccrontol.ServerProcessMes(&mes)
		if err != nil {
			fmt.Println("ServerProcessMes返回异常,err=", err)
			return err
		}

	}
}
